// 元素类型
let element2: (HTMLElement | null) = document.getElementById('root')
// 开启"strictNullChecks": true,后 显示错误,
// element2.style.color = 'green' //对象可能为 "null"。
// 解决办法:在此处添加非空断言 !,这个写法目的是为了告诉ts,元素element2确定不会为null
element2!.style.color = 'green'



// never类型 代表不会出现的值
// 1.作为不会返回的函数返回值类型


// never报错：返回“从不”的函数不能具有可访问的终结点。
// 解决办法: 不返回内容 直接抛出错误
// 使用场景：死循环 或异常退出比较常用
function error(message: string): never {
    throw new Error('报错了') //直接异常结束,并不会有返回值
    // 在上方停止,所以下方内容并不会执行
    console.log('ok');
}

// example
function fn(x: string | number) {
    if (typeof x === 'string') {
        console.log('是一个字符串');
    } else if (typeof x === 'number') {
        console.log('是一个数字');
    } else {
        console.log('是一个其他类型'); //typescript中,是永远不可能走到这里的，这里指就是never类型
    }
}


// void类型 代表没有任何类型,函数没有返回值那么就是void类型
function get(): void {
    // return null; //不能返回null
    return undefined; // 可以返回undefined
}


// Symbol类型  唯一不变的值
// 在tsconfig.json中添加依赖库  lib:["ESNext"]
const s1 = Symbol('1')
console.log(s1);  //Symbol(1)
const s2 = Symbol('1')
console.log(s2);  //Symbol(1)
// console.log(s1 === s2); 
//报错返回:此条件将始终返回 "false"，因为类型 "typeof s1" 和 "typeof s2" 没有重叠。



// BigInt 安全的存储超级大的数字
// 在tsconfig.json中添加依赖库 lib:["ESNext"] target:"ESNext"
// const max = Number.MAX_SAFE_INTEGER //js允许的最大值 2*53次方-1
// console.log(max+1 === max+2); // true 原因是超出了js所承受的最大值,所以 超过的数值都相等
// 接入TS类型校验BigInt
const max = BigInt(Number.MAX_SAFE_INTEGER)
// console.log(max+1 === max+2); //运算符“+”不能应用于类型“bigint”和“1”。
// 解决办法(使1、2 变成BigInt类型)
console.log(max + BigInt(1) === max + BigInt(2));
console.log(max + 1n === max + 2n);


// 另外 Number类型和 BigNit类型不兼容
// JS的类型 Number BigNit
// TS的类型 number bignit